home *** CD-ROM | disk | FTP | other *** search
- cunpack - convert packed character format file to random binary
- c
- c This routine converts Kermit-GCOS from the packed character
- c format used on the Columbia distribution tape to an executable
- c Honeywell H* file.
- c
- c The packed format is:
- c Columns Contents
- c 1- 6 Zero origin word address of first word on line
- c 7-12 First data word as 6 characters
- c 13-18 Second data word
- c ... ...
- c 61-66 Tenth data word
- c 67 Checksum for this data line
- c 68 "|"
- c
- c Data words are packed into six ASCII characters each, using only
- c printable ASCII characters in the range 32 through 96, excluding
- c 64.
- c These are formed by
- c adding 32 to each 6-bit field from a 36-bit word, plus one if the
- c six-bit value is 32 or greater.
- c Thus, each 10 words generate a 15 word ASCII
- c data record. Data records consisting of only words which are all
- c zero are discarded.
- c
- c The checksum is the rightmost six bits of the integer value
- c obtained by adding each of the 60 6-bit field used to generate
- c the data string, plus 32 to make it a printing ASCII character,
- c plus one if the original value is 32 or greater.
- c
- c The final "|" is added to make the record length a multiple of
- c four so record boundaries fall on word boundaries without padding,
- c and to give a simple visual verification of the correct end of
- c line.
- c
- c hstar - file code for random binary output file
- integer hstar/01/
- c infile - file code for packed text input file
- integer infile/02/
- c otbuff - buffer for binary output block
- integer otbuff(320)
- c text file input records are composed of:
- c inword - integer offset of first data word on line
- integer inword
- c inbuff - 15 words of ASCII text - binary in packed format.
- integer inbuff(15)
- c chksum - checksum computed when text record was formed.
- integer chksum
- c inrec - count of input text records
- integer inrec
- c otrec - count of binary output blocks
- integer otrec
- c
- write(6,6010)
- 6010 format(' Begin packed character to random binary conversion.')
- c define record length of random binary output file
- call ransiz(hstar,320,1)
- inrec = 0
- otrec = 1
- c clear output buffer
- do 5 ix=1,320
- otbuff(320) = 0
- 5 continue
- c
- c process each input record until end of text file.
- 10 read(infile,1010,end=100) inword,inbuff,chksum
- 1010 format(i6,15a4,a1)
- inrec = inrec+1
- 12 if (inword .lt. 320*otrec) goto 20
- write(hstar'otrec) otbuff
- otrec = otrec + 1
- do 15 ix=1,320
- otbuff(ix) = 0
- 15 continue
- goto 12
- 20 call unpak2(inword,inbuff,chksum,otbuff(mod(inword,320)+1))
- goto 10
- c
- c flush final output buffer
- 100 write(hstar'otrec) otbuff
- write(6,6090) inrec,otrec
- 6090 format(' Records read =',i4/
- & ' Blocks written=',i4/
- & ' Conversion completed')
- stop
- end
- subroutine unpak2(inword,inbuff,chksum,otbuff)
- c
- c Convert 10 words in packed text format to binary data.
- c Validate the checksum, and report any errors.
- c
- integer inword
- integer inbuff(15)
- integer otbuff(10)
- integer chksum
- c
- c ASF to put 6-bits into binary output data word
- raw(ix) = fld(6*mod(ix-1,6),6,otbuff((ix+5)/6))
- c ASF to get 6-bit value out of 9-bit field on text record
- packed(ix) = fld(9*mod(ix-1,4),9,inbuff((ix+3)/4)) - 32
- c
- integer ix
- c newsum - local computation of checksum from packed text
- integer newsum
- c
- newsum = 0
- do 10 ix=1,60
- ichar = packed(ix)
- newsum = newsum + ichar
- if (ichar .ge. 32) ichar = ichar - 1
- raw(ix) = ichar
- 10 continue
- newsum = fld(30,6,newsum)
- if (newsum .ge. 32) newsum = newsum+1
- newsum = newsum + 32
- chksum = fld(0,9,chksum)
- if (newsum .ne. chksum) write(6,6010) inword,newsum,chksum
- 6010 format(' Checksum error at word',i6/
- & ' Computed: ',o12,' Actual: ',o12)
- return
- end
-